package com.tenbent.product.base.config.swagger;

import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

/**
 * Swagger2配置类
 *
 * 在与spring boot集成时，放在与Application.java同级的目录下。
 *
 * 通过@Configuration注解，让Spring来加载该类配置。
 *
 * 再通过@EnableSwagger2注解来启用Swagger2。
 *
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {

	/**
	 * 创建API应用
	 *
	 * apiInfo() 增加API相关信息
	 *
	 * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现，
	 *
	 * 本例采用指定扫描的包路径来定义指定要建立API的目录。
	 *
	 * @return
	 */
	@Bean
	public Docket buildDocketApi() {
		return new Docket(DocumentationType.SWAGGER_2)
				.groupName("student")
				.apiInfo(buildApiInfo())
				.select()
				//指定具体某个包下的API
//				.apis(RequestHandlerSelectors.basePackage("com.tenbent.product.center.example.stu.action"))
				//指定任意包下的API
//				.apis(RequestHandlerSelectors.any())
				//指定有ApiOperation注解的类生产API文档
				.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//				.paths(PathSelectors.any()) // 对所有路径进行监控
				.paths(PathSelectors.ant("/api/**"))
				.build()
				.globalOperationParameters(setQueryToken());
	}

	@Bean
	public Docket buildOatuhTokenDocketApi() {
		return new Docket(DocumentationType.SWAGGER_2)
				.groupName("token")
				.apiInfo(buildTokenApiInfo())
				.select()

				//指定具体某个包下的API
//				.apis(RequestHandlerSelectors.basePackage("com.tenbent.product.center.token.action"))
				//指定任意包下的API
//				.apis(RequestHandlerSelectors.any())
				//指定有ApiOperation注解的类生产API文档
				.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//				.paths(PathSelectors.any()) // 对所有路径进行监控
				.paths(PathSelectors.ant("/ten_bent/**"))
				.build();
	}

	/**
	 * 创建该API的基本信息（这些基本信息会展现在文档页面中）
	 *
	 * 访问地址：http://项目实际地址/swagger-ui.html
	 *
	 * @return
	 */
	private ApiInfo buildApiInfo() {
		return new ApiInfoBuilder()
				.title("腾保学生API文档")
				.termsOfServiceUrl("http://www.baidu.com")
				.description("springmvc swagger2")
				.contact(new Contact("Randy Yan", "http://blog.csdn.net/u014231523", "kaiwei3819@163.com"))
				.build();
	}

	private ApiInfo buildTokenApiInfo() {
		return new ApiInfoBuilder()
				.title("腾保授权token API文档")
				.termsOfServiceUrl("http://www.163.com")
				.description("springmvc swagger2")
				.contact(new Contact("Randy Yan", "http://blog.csdn.net/u014231523", "kaiwei3819@163.com"))
				.build();
	}

	/**
	 * 设置接口文档测试接口时需要token
	 *
	 * http://localhost:8080/oauth/token?grant_type=password&username=yan&password=$2a$10$9a86qccwoHI.MCX03wFg..lM67bUIjZRWmggJEbCg0MqgN.WT/mBG
	 *
	 * */
	private List<Parameter> setQueryToken() {
		ParameterBuilder tokenPar = new ParameterBuilder();
		List<Parameter> pars = new ArrayList<>();
		tokenPar.name("access_token").description("Authorization token").modelRef(new ModelRef("string")).parameterType("query").required(true).build();
		pars.add(tokenPar.build());
		return pars;
	}
}
